import COS from 'cos-js-sdk-v5'
import { storeToRefs } from 'pinia';
import dayjs from 'dayjs'
const { cnyzs } = storeToRefs(cnyzsCommonpinia())
const { userinfo } = storeToRefs(cnyzsUserpinia())

export class Cos {

   Bucket = cnyzs.value.COMMON_SPBM?.OPTIONS?.COS?.BUCKET
   Region = cnyzs.value.COMMON_SPBM?.OPTIONS?.COS?.REGION

   constructor() { }

   // 获取临时密钥
   _cos(): any {
      return new COS({
         getAuthorization: (options: any, callback: any) => {
            // console.log(options);
            // 初始化时不会调用，只有调用 cos 方法（例如 cos.putObject）时才会进入
            // 异步获取临时密钥
            cnyzsRequest('/api/upload/cos-getTemporarykey', {
               method: 'POST', data: {
                  Bucket: this.Bucket,
                  Region: this.Region
               }
            }).then(({ status, data, message }: any) => {
               if (status === 200) {
                  callback({
                     TmpSecretId: data.credentials.tmpSecretId, // 临时密钥的 tmpSecretId
                     TmpSecretKey: data.credentials.tmpSecretKey, // 临时密钥的 tmpSecretKey
                     SecurityToken: data.credentials.sessionToken, // 临时密钥的 sessionToken
                     ExpiredTime: data.expiredTime, // 临时密钥失效时间戳，是申请临时密钥时，时间戳加 durationSeconds
                  });
               } else {
                  callback(null)
               }
            })
         }
      })
   }

   /**
    * 文件直传 (带腾讯云数据万象基础图片压缩转webp类型)
    * @param {Object} obj File
    * @param {Boolean} iswebp 是否压缩转webp类型
    * @param {Function} fn 进度条回调函数 ： 可选
    * @returns err || data
   */
   putObject(obj: any, iswebp?: boolean, fn?: any) {

      // 处理存放目录
      const userId = userinfo.value.id
      const resourceType = obj.File.type.split('/')[0] // 资源类型 图片、视频、附件 ...
      const Time = new Date().getTime()
      const Random = Math.floor(Math.random() * 88 + 10)
      const date = dayjs(Time).format('YYYY/MM/DD')
      const path = `cnyzs/${userId}/${resourceType}/${date}/${Time}-${Random}.${obj.File.type.split('/')[1]}`

      // 上传编号
      let taskId = ''
      return new Promise((resolve, reject) => {
         this._cos().putObject({
            Bucket: this.Bucket,            /* 填入您自己的存储桶，必须字段 */
            Region: this.Region,            /* 存储桶所在地域，例如 ap-beijing，必须字段 */
            Key: path,                      /* 存储在桶里的对象键（例如1.jpg，a/b/test.txt），必须字段 */
            Body: obj.File,                 /* 必须  files */
            // SliceSize: 1024 * 1024 * 5,  /* 触发分块上传的阈值，超过5MB使用分块上传，非必须 */
            Headers: (iswebp === true && resourceType === 'image') ? {
               // 通过 imageMogr2 接口进行 webp 压缩，可以根据需要压缩的类型填入不同的压缩格式：webp/heif/tpg/avif/svgc
               'Pic-Operations':
                  `{"is_pic_info": 1, "rules": [{"fileid": "${Time}-${Random}.${obj.File.type.split('/')[1]}", "rule": "imageMogr2/format/webp"}]}`,
            } : undefined,
            onTaskReady: function (taskIds: any) {
               // 上传编号 非必须
               // console.log("taskId", taskId);
               taskId = taskIds
            },
            onProgress: function (progressData: any) {
               // 进度条 非必须
               let percent = progressData.percent * 10000 / 100;
               let speed = progressData.speed / 1024 / 1024 * 100 / 100;
               // 回调函数
               if (fn) {
                  fn({ percent: percent, speed: speed, taskId: taskId })
               }
            },
         }, (err: any, data: any) => {
            if (err) return reject(err)
            return resolve(data)
         })
      })
   }

}


